package com.c2b.algorithm.leetcode.base;

/**
 * 2的幂
 * <p>给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。
 *
 * @author c2b
 * @since 2022/5/19 13:20
 */
public class LC0231 {

    /**
     * 判断整数n是否是 2 的幂次方
     *
     * @param n 整数n
     * @return boolean 如果是，返回 true ；否则，返回 false
     * @author c2b
     * @since  2022/5/19 13:20
     */
    public boolean isPowerOfTwo(int n) {
        if (n <= 0) {
            return false;
        }
        int abs = Math.abs(n);
        int num = 0;
        while (abs != 0) {
            if ((abs & 1) == 1) {
                num++;
            }
            abs >>= 1;
        }
        return num == 1;
    }


    /**
     * 取巧的方法
     */
    public boolean isPowerOfTwo2(int n) {
        // 2^0 0000 0001  (2^0)-1  ==》 0000 0000  & 运算  必定为0
        // 2^1 0000 0010  (2^1-1)  ==》 0000 0001  & 运算  必定为0
        // 2^2 0000 0100  (2^2-1)  ==》 0000 0011  & 运算  必定为0
        // 2^3 0000 1000  (2^3-1)  ==》 0000 0111  & 运算  必定为0
        // 2^4 0001 0000  (2^4-1)  ==》 0000 1111  & 运算  必定为0
        // 2^5 0010 0000  (2^5-1)  ==》 0001 1111  & 运算  必定为0
        // ...
        return n > 0 && (n & (n - 1)) == 0;
    }

    public static void main(String[] args) {
        System.out.println(new LC0231().isPowerOfTwo(16));
    }
}
